#include <iostream>
using std::cout;
using std::endl;

class FFF
{
public:
    void print(int x){
        cout << "FFF::print:" << x << endl;
    }

    void display(int x){
        cout << "FFF::display:" << x << endl;
    }

    void func(){}


    static void show(int x){
        cout << "FFF::show:" << x << endl; 
    }

};

void print(int x){
    cout << "print:" << x << endl;
}

void display(int x){
    cout << "display:" << x << endl;
}

void show(){
    cout << "show" << endl;
}

//给这种类型的函数指针总结出一个类型名称
typedef void (*Function)(int);
//给这种类型的成员函数指针总结出一个类型名称
typedef void (FFF::*MemFunction)(int);

void test0(){
    Function f;
    /* f = FFF::print; */
    f = FFF::show;
    f(10);
}

void test1(){
    //定义一个成员函数指针时要确定
    //属于哪个类、函数返回类型、参数信息
    //定义时需要使用完整形式，加&
    void (FFF::*p)(int) = &FFF::print;
    FFF fff;
    //.*是成员指针运算符的第一种形式
    (fff.*p)(10);
    p = &FFF::display;
    (fff.*p)(11);
    /* p = &FFF::func; */

    void (FFF::*p2)(int) = &FFF::print;
    (fff.*p2)(10);

    /* void (FFF::*)(int) p3; */
    MemFunction p3;
    p3 = &FFF::display;
    (fff.*p3)(19);

    FFF * fp = new FFF();
    /* fp->print(10); */
    //->*是成员指针运算符的第二种形式
    (fp->*p3)(20);

    fp = nullptr;
    (fp->*p3)(30);
    /* fp->print(1); */
    /* fp->display(2); */


}

int main(void){
    test1();
    return 0;
}
